<?php
class pdo_mysql extends PDO {
	private $dbprefix;
	private $query;
	private $fetch_type='FETCH_ASSOC';		
	function __construct($config,$charset='UTF8'){
		$conn=$config['dbtype'].':host='.$config['dbhost'].';port='.$config['dbport'].';dbname='.$config['dbname'];
		$this->dbprefix=$config['dbprefix'];
		try{
			parent::__construct($conn,$config['dbuser'],$config['dbpass'],
			array('PDO_ATTR_PERSISTENT'=>true));
			$this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);   
			$this->query("SET NAMES {$config['charset']}");
		}catch(PDOExecption $e){
			error_box('Error!!'.$e->getMessage());
		}
	}
	##初始化PDO的入口函数
	public static function get_connect($config){
		return new pdo_mysql($config);
	}
	
	#替换SQl语句中的前缀部份
	protected function replace_prefix($strQuery){
		$strQuery=str_replace('`#__','`'.$this->dbprefix,$strQuery);
		return $strQuery;
	}
	#取得其中一条数据
	#如果没有SQL语句，将会返回预先设置的SQL语句
	public function fetch($sql=null){
		if (empty($sql)) {
			#如果没有SQL语句
			$this->query=parent::execute();
		}else{
			$this->query=$this->query($sql);
		}
		if(!$this->query){
			error_box('数据库操作错误','-1');
		}
		$this->setAttribute();
		return $this->query->fetch();
	}
	#取得所有结果
	#如果没有SQL语句，将会返回预先设置的SQL语句
	public function fetchAll($sql=null){
		if (empty($sql)) {
			#如果没有SQL语句
			$this->query=parent::execute();
		}else{
			$this->query=$this->query($sql);
		}
		if(!$this->query){
			error_box('数据库操作错误','-1');
		}
		$this->set_Attr();
		///$this->query->setFetchMode(PDO::FETCH_ASSOC);
		return $this->query->fetchAll();
	}
	#取得其中一个结果
	#如果没有SQL语句，将会返回预先设置的SQL语句
	function fetchColumn($sql=null){
		if (empty($sql)) {
			#如果没有SQL语句
			$this->query=parent::execute();
		}else{
			$this->query=$this->query($sql);
		}
		$this->setAttribute();
		return $this->query->fetchColumn();
	}
	##修改取数据的方式
	protected function set_Attr(){
		switch ($this->fetch_type){
			case 'FETCH_ASSOC':
				$this->query->setFetchMode(PDO::FETCH_ASSOC);
				return true;
			case 'FETCH_NUM':
				$this->query->setFetchMode(PDO::FETCH_NUM);
				return true;
			case 'FETCH_BOTH':
				$this->query->setFetchMode(PDO::FETCH_BOTH);
				return true;
			case 'FETCH_OBJ':
				$this->query->setFetchMode(PDO::FETCH_OBJ);
				return true;
			default:
				return false;
		}
		if($this->fetch_type=='FETCH_ASSOC'){
			$this->query->setFetchMode(PDO::FETCH_ASSOC);
		}
	}
	public function set_fetchmode($mode){
		switch ($mode){
			case 'assoc':
				$this->fetch_type='FETCH_ASSOC';
				break;
			case 'row':
				$this->fetch_type='FETCH_NUM';
				break;
			case 'array':
				$this->fetch_type='FETCH_BOTH';
				break;
			case 'obj':
				$this->fetch_type='FETCH_OBJ';
				break;
			default:
				$this->fetch_type='FETCH_ASSOC';
				break;
		}
		return true;
	}
	##执行SQL语句，有返回值的
	public function query($sql){
		$sql=$this->replace_prefix($sql);
		return parent::query($sql);
	}
	#设置SQL语句,预处理的方式
	public function prepare($sql){
		parent::prepare($sql);
	}
}
?>